package com.atguigu.tingshu.order.strategy;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * 构建结算页所需要的数据的策略接口
 */
public interface OrderTradeStrategy {

    // 定义结算页所需要的数据抽象方法
    public abstract OrderInfoVo trade(TradeVo tradeVo);

    // 获取付款项目的类型
    public abstract String getItemType() ;

    public default void setOtherData(OrderInfoVo orderInfoVo , TradeVo tradeVo , RedisTemplate<String , String> redisTemplate) {

        // 设置时间戳和数据签名
        String tradeNo = UUID.randomUUID().toString().replace("-", "");      // 生成一个uuid作为交易号
        orderInfoVo.setTradeNo(tradeNo);
        orderInfoVo.setPayWay(SystemConstant.ORDER_PAY_WAY_WEIXIN);     // 微信支付： 1101
        orderInfoVo.setItemType(tradeVo.getItemType());
        orderInfoVo.setTimestamp(SignHelper.getTimestamp());
        String orderInfoVoJson = JSON.toJSONString(orderInfoVo);
        Map<String , Object> map = JSON.parseObject(orderInfoVoJson, Map.class);
        String sign = SignHelper.getSign(map);
        orderInfoVo.setSign(sign);

        //  把交易号保存到Redis中
        String redisKey = RedisConstant.ORDER_TRADE_PREFIX + tradeNo;
        redisTemplate.opsForValue().set(redisKey , tradeNo , 5 , TimeUnit.MINUTES);

    }

}
